﻿using System;
using System.Collections.Generic;
using System.Web.UI.WebControls;
using MIAP.Entidades;
using MIAP.Negocio;
using MIAPWEB.Common;

namespace MIAPWEB.Forms
{
    public partial class AtiendeSolicitud : PageBase
    {
        #region Campos

        /// <summary>
        /// Clase de negocio de las operaciones de Atiende Solicitud..
        /// </summary>
        private AtenderSolicitudRecargaNegocio atiendeSolicitudRecargaNegocio;

        #endregion

        #region Propiedades

        /// <summary>
        ///  Obtiene o establece la solicitud de recarga.
        /// </summary>
        public SolicitudRecargaArchivoInfo SolicitudRecarga
        {
            get
            {
                return this.ViewState["SolicitudRecarga"] as SolicitudRecargaArchivoInfo;
            }

            set
            {
                this.ViewState["SolicitudRecarga"] = value;
            }
        }

        /// <summary>
        ///  Obtiene o establece la lista de solicitud de recarga.
        /// </summary>
        private List<SolicitudRecargaArchivoInfo> DataSourceSolicitudes
        {
            get
            {
                if (this.ViewState["DataSourceSolicitudes"] == null)
                {
                    this.ViewState["DataSourceSolicitudes"] = new List<SolicitudRecargaArchivoInfo>();
                }

                return this.ViewState["DataSourceSolicitudes"] as List<SolicitudRecargaArchivoInfo>;
            }

            set
            {
                this.ViewState["DataSourceSolicitudes"] = value;
            }
        }

        #endregion

        #region Constructor

        /// <summary>
        /// Inicializa una instancia de <see cref="AtiendeSolicitud"/>
        /// </summary>
        public AtiendeSolicitud()
        {
            this.atiendeSolicitudRecargaNegocio = new AtenderSolicitudRecargaNegocio();
        }

        #endregion

        #region Eventos

        /// <summary>
        /// Evento que se ejecuta al cargar la página.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void Page_Load(object sender, EventArgs e)
        {
            this.grdSolicitudes.PageSize = Convert.ToInt32(new ConfiguracionNegocio().GetNumeroPaginasGrid().Descripcion);
            if (!this.IsPostBack)
            {
                this.SolicitudRecarga = new SolicitudRecargaArchivoInfo();

                this.GetSolicitudesPendientes();
            }
        }      

        /// <summary>
        /// Método ejecutado al dar click en el botón autorizar solicitud. Cambia el estatus de la solicitud a autorizada.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void btnAutorizarSolicitud_Click(object sender, EventArgs e)
        {
            if (this.SolicitudRecarga.IdSolicitud != default(int))
            {
                this.ObtenerComentariosSolicitud();

                this.atiendeSolicitudRecargaNegocio.EditEstatusSolicitud(SolicitudRecarga, true, AppSessionManager.Instance.Usuario);

                this.ShowMessage(this.GetGlobalResourceObject("Strings", "AltaSolicitudRecarga_SolicitudAutorizada").ToString());
                string correo =
                    this.atiendeSolicitudRecargaNegocio.GetUsuarioById(SolicitudRecarga.IdSolicitante).DireccionCorreo;

                EnvioCorreo.Instance.EnviaCorreoRespuestaSolicitud(correo,true,SolicitudRecarga.NombreArchivo,this.SolicitudRecarga.Comentarios);
                this.Refresh();
            }
            else
            {
                this.ShowMessage(this.GetGlobalResourceObject("Strings", "ErrorSeleccionarElemento").ToString());
            }
        }

        /// <summary>
        /// Método ejecutado al dar click en el botón cancelar solicitud. Cambia el estatus de la solicitud a rechazada.
        /// </summary>
        /// <param name="sender">Objeto que invoce el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void btnRechazarSolicitud_Click(object sender, EventArgs e)
        {
            if (this.SolicitudRecarga.IdSolicitud != default(int))
            {
                this.ObtenerComentariosSolicitud();

                this.atiendeSolicitudRecargaNegocio.EditEstatusSolicitud(SolicitudRecarga, false, AppSessionManager.Instance.Usuario);

                string correo =
                    this.atiendeSolicitudRecargaNegocio.GetUsuarioById(SolicitudRecarga.IdSolicitante).DireccionCorreo;

                EnvioCorreo.Instance.EnviaCorreoRespuestaSolicitud(correo, false, SolicitudRecarga.NombreArchivo, this.SolicitudRecarga.Comentarios);

                this.Refresh();

                this.ShowMessage(this.GetGlobalResourceObject("Strings", "AltaSolicitudRecarga_SolicitudRechazada").ToString());
            }
            else
            {
                this.ShowMessage(this.GetGlobalResourceObject("Strings", "ErrorSeleccionarElemento").ToString());
            }
        }

        /// <summary>
        /// Método ejecutado al dar click al botón salir. Redirecciona a la página principal.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Arguementos del evento.</param>
        protected void btnSalir_Click(object sender, EventArgs e)
        {
            Response.Redirect(Common.AppUrls.Default);
        }

        /// <summary>
        /// Método ejecutado al seleccionar un elemento del grid. Obtiene los datos del item seleccionado.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void grdSolicitudes_SelectedIndexChanged(object sender, EventArgs e)
        {
            GridViewRow row = ((GridView)sender).SelectedRow;

            var dataKeys = this.grdSolicitudes.DataKeys[((GridView)sender).SelectedIndex];

            this.SolicitudRecarga.IdSolicitud = int.Parse(dataKeys[0].ToString());
            this.SolicitudRecarga.IdUsuario = AppSessionManager.Instance.IdUsuario;            
            this.SolicitudRecarga.IdArchivo = int.Parse(dataKeys[1].ToString());
            this.SolicitudRecarga.NombreArchivo = row.Cells[3].Text;     
            this.SolicitudRecarga.Año = int.Parse(dataKeys[2].ToString());
            this.SolicitudRecarga.Mes = int.Parse(dataKeys[3].ToString());
            this.SolicitudRecarga.Version = dataKeys[4].ToString();
            this.SolicitudRecarga.IndicadorVersionValida = bool.Parse(dataKeys[5].ToString());
            this.SolicitudRecarga.IdSolicitante = int.Parse(dataKeys[6].ToString());
        }

        /// <summary>
        /// Evento que se ejecuta cuando se cambia de página en el grid.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void grdSolicitudes_OnPageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            this.grdSolicitudes.PageIndex = e.NewPageIndex;
            this.grdSolicitudes.DataSource = this.DataSourceSolicitudes;
            this.grdSolicitudes.DataBind();
        }
        #endregion

        #region Métodos

        /// <summary>
        /// Obtiene las solicitudes pendientes que el usuario puede autorizar.
        /// </summary>
        public void GetSolicitudesPendientes()
        {
            this.DataSourceSolicitudes = this.atiendeSolicitudRecargaNegocio.GetSolicitudesPendientes(AppSessionManager.Instance.IdUsuario);
            this.grdSolicitudes.DataSource = this.DataSourceSolicitudes;
            this.grdSolicitudes.DataBind();
        }

        /// <summary>
        /// Obtiene los comentarios para la solicitud.
        /// </summary>
        public void ObtenerComentariosSolicitud()
        {
            this.SolicitudRecarga.Comentarios = txtComentarios.Text;
        }

        /// <summary>
        /// Refresca los controles.
        /// </summary>
        public void Refresh()
        {
            this.GetSolicitudesPendientes();
            this.grdSolicitudes.SelectedIndex = -1;
            this.txtComentarios.Text = string.Empty;
            this.SolicitudRecarga = new SolicitudRecargaArchivoInfo();
        }

        #endregion       
    }
}